package model.lendables;

import java.io.File;
import java.util.Observable;

import model.EMedium;
import model.EMediumAttribute;
import model.EMediumPropertiesData;
import model.EMediumType;

/**
 * Classe Lendable que representa um item que pode ser alugado. 
 * Esta mantem informacao sobre o tipo do media (EMediumType),
 * as propriedades do media (EMediumPropertiesData), a informacao 
 * do ficheiro em disco(File) e o numero de licencas disponiveis
 * @author DCO37
 * 	N.º 42484 Helder Ferreira
 *  N.º 45509 Luis Ferreira
 */
public class Lendable extends Observable implements EMedium {

	private EMediumType type;
	private EMediumPropertiesData properties;
	private File file;
	private int licenses;

	/**
	 * Construtor Lendable que representa um item que pode ser alugado
	 * @param type
	 * @param properties
	 */
	public Lendable(EMediumType type, EMediumPropertiesData properties) {

		this.type = type;
		this.properties = properties;
		//this.licenses = (Integer) properties.getAttribute(EMediumAttribute.LICENSES);
		this.licenses=5;
		this.file = (File) properties.getAttribute(EMediumAttribute.PATH);
	
	}
	
	/**
	 * Aluga um item
	 */
	public void rent() {
		licenses--;
	}
	
	/**
	 * Verifica se existem licencas disponiveis para este item
	 * @return se existem licencas true false caso contrario
	 */
	public boolean hasLicensesAvailable() {
	
		return (licenses != 0) ? true : false;
	}

	/**
	 * Compara 2 eMedims
	 */
	@Override
	public int compareTo(EMedium o) {
		return this.getFile().compareTo(o.getFile());

	}

	/**
	 * Devolve um file
	 * @return file
	 */
	@Override
	public File getFile() {
		return this.file;
	}
	
	/**
	 * Devolve um Title
	 * @return getTitle
	 */
	@Override
	public String getTitle() {
		return (String) this.properties.getAttribute(EMediumAttribute.TITLE);
	}

	/**
	 * Devolve um InternetType
	 * @return getTitle
	 */
	@Override
	public String getInternetType() {
		return (String) this.properties.getAttribute(EMediumAttribute.INTERNET_TYPE);
	}

	/**
	 * Devolve um Type
	 * @return getTitle
	 */
	@Override
	public EMediumType getType() {	
		return (EMediumType) this.properties.getAttribute(EMediumAttribute.MEDIUM_TYPE);
	}

	/**
	 * Devolve um EMediumProperties
	 * @return getTitle
	 */
	@Override
	public EMediumPropertiesData getEMediumProperties() {
		return properties;
	}

	/**
	 * Devolve um hashCode
	 * @return int
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((file == null) ? 0 : file.hashCode());
		result = prime * result + licenses;
		result = prime * result
				+ ((properties == null) ? 0 : properties.hashCode());
		result = prime * result + ((type == null) ? 0 : type.hashCode());
		return result;
	}

	/**
	 * Verifica se dois objectos sao iguais
	 * @return true caso sejam iguais ou false caso contrario
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Lendable other = (Lendable) obj;
		if (file == null) {
			if (other.file != null)
				return false;
		} else if (!file.equals(other.file))
			return false;
		if (licenses != other.licenses)
			return false;
		if (properties == null) {
			if (other.properties != null)
				return false;
		} else if (!properties.equals(other.properties))
			return false;
		if (type != other.type)
			return false;
		return true;
	}
	
}
